import pymysql
import pandas as pd

# 建立与MySQL数据库的连接
cnx = pymysql.connect(
  host='localhost',
  user='root',
  password='root',
  database='StudentInfo'
)

# 构建SQL查询语句，提取用户-绩点数据
query = "SELECT user_id, course_id, grade FROM user_grades"

# 使用pandas的read_sql函数执行查询并将结果存储到DataFrame中
df = pd.read_sql(query, cnx)

# 关闭数据库连接
cnx.close()

# 创建用户-绩点的关系矩阵
user_grade_matrix = df.pivot_table(index='user_id', columns='course_id', values='grade', fill_value=0)
print(user_grade_matrix)

from scipy.spatial.distance import cosine

# 计算绩点之间的相似性度量（余弦相似度）
grade_sim_matrix = pd.DataFrame(index=user_grade_matrix.columns, columns=user_grade_matrix.columns)

for grade1 in grade_sim_matrix.index:
    for grade2 in grade_sim_matrix.columns:
        user_grade1 = user_grade_matrix[grade1]
        user_grade2 = user_grade_matrix[grade2]
        similarity = 1 - cosine(user_grade1, user_grade2)
        grade_sim_matrix.loc[grade1, grade2] = similarity

print(grade_sim_matrix)

from sklearn.metrics.pairwise import cosine_similarity

# 计算用户之间的相似性度量（余弦相似度）
user_similarity_matrix = pd.DataFrame(
    cosine_similarity(user_grade_matrix),
    index=user_grade_matrix.index,
    columns=user_grade_matrix.index
)
print(user_similarity_matrix)
def get_user_recommendations(user_id, top_n=3):
    user_similarity = user_similarity_matrix[user_id]  # 获取给定用户与其他用户的相似度

    # 找到与给定用户最相似的其他用户
    similar_users = user_similarity.sort_values(ascending=False)[1:top_n+1]

    # 生成推荐列表
    recommendations = user_grade_matrix.loc[similar_users.index, :]
    return recommendations


# 从用户获取输入值并将其赋给变量
user_id  = int(input("请输入一个值: "))  # 将输入的用户ID转换为整数类型
top_n = int(input("请输入一个值: "))  # 将输入的推荐列表数量转换为整数类型

# 调用get_user_recommendations函数，传入用户ID和推荐列表的数量
recommendations = get_user_recommendations(user_id, top_n)

# 打印推荐列表
print(recommendations)

